<?php

namespace common\component;

/**
 * Curl wrapper for Yii
 * @author hackerone
 */
class Common
{
    /**
     * 大数据导出csv
     * @param type $columnArr
     * @param type $data
     * @param type $filename
     */
    public static function exportBigCsv($columnArr, $data, $filename) {
        set_time_limit(0);
//        header('Content-Type: application/vnd.ms-excel');
//        header('Content-Disposition: attachment;filename="' . $filename . '"');
//        header('Cache-Control: max-age=0');

        // 从数据库中获取数据，为了节省内存，不要把数据一次性读到内存，从句柄中一行一行读即可
        if(!file_exists(Yii::getPathOfAlias('webroot').'/'.'upload/'.$filename)){
            // 输出Excel列名信息
            $head = $columnArr;
            // 打开要保存的文件并以追加的模式写入,如果没有,则创建。
            $fp = fopen(Yii::getPathOfAlias('webroot').'/'.'upload/'.$filename, 'a+');
            foreach ($head as $i => $v) {
                // CSV的Excel支持GBK编码，一定要转换，否则乱码
                $head[$i] = iconv('utf-8', 'gbk//IGNORE', $v);
            }
            // 将数据通过fputcsv写到文件句柄
            fputcsv($fp, $head);

        }else{
            // 打开要保存的文件并以追加的模式写入,如果没有,则创建。
            $fp = fopen(Yii::getPathOfAlias('webroot').'/'.'upload/'.$filename, 'a+');
        }

        // 计数器
        $cnt = 0;
        // 每隔$limit行，刷新一下输出buffer，不要太大，也不要太小
        $limit = 10000;
        // 逐行取出数据，不浪费内存
        foreach ($data as $key => $value) {
            $cnt ++;
            if ($limit == $cnt) {
                //刷新一下输出buffer，防止由于数据过多造成问题
                ob_flush();
                flush();
                $cnt = 0;
            }
            foreach ($value as $i => $v) {
                //增加TRANSLIT,会将无法识别的gbk编码转化为其他代替字符，避免报错
                //如使用IGNORE,会把无法识别的gbk编码直接去掉
                $value[$i] = iconv('utf-8', 'gbk//IGNORE', $v);
            }
            fputcsv($fp, $value);
        }
        fclose($fp);
    }

    /**
     * 导出csv
     * @param type $columnArr
     * @param type $data
     * @param type $filename
     */
    public static function exportCsv($columnArr, $data, $filename) {
        set_time_limit(0);
        header('Content-Type: application/vnd.ms-excel');
        header('Content-Disposition: attachment;filename="' . $filename . '"');
        header('Cache-Control: max-age=0');
        // 从数据库中获取数据，为了节省内存，不要把数据一次性读到内存，从句柄中一行一行读即可
        // 打开PHP文件句柄，php://output 表示直接输出到浏览器
        $fp = fopen('php://output', 'w');

        // 输出Excel列名信息
        $head = $columnArr;
        foreach ($head as $i => $v) {
            // CSV的Excel支持GBK编码，一定要转换，否则乱码
            $head[$i] = iconv('utf-8', 'gbk//IGNORE', $v);
        }
        // 将数据通过fputcsv写到文件句柄
        fputcsv($fp, $head);
        // 计数器
        $cnt = 0;
        // 每隔$limit行，刷新一下输出buffer，不要太大，也不要太小
        $limit = 10000;
        // 逐行取出数据，不浪费内存
        foreach ($data as $key => $value) {
            $cnt ++;
            if ($limit == $cnt) {
                //刷新一下输出buffer，防止由于数据过多造成问题
                ob_flush();
                flush();
                $cnt = 0;
            }
            foreach ($value as $i => $v) {
                //增加TRANSLIT,会将无法识别的gbk编码转化为其他代替字符，避免报错
                //如使用IGNORE,会把无法识别的gbk编码直接去掉
                $value[$i] = iconv('utf-8', 'gbk//IGNORE', $v);
            }
            fputcsv($fp, $value);
        }
        fclose($fp);
    }

}